#include <stdio.h>
#include <stdlib.h>
#include "kbhit.h"
#include "conio.h"
#include <unistd.h>
#define MAX_LEN 10			//队列的最大容量
typedef char ElemType;		//数据的类型

typedef struct CircleQueue		
{
	ElemType data[MAX_LEN];		
	int front;			//保存队首的下标
	int rear;			//保存队尾的下标
	int node_num;		//保存队列中元素的个数
}CQ;

/*
	初始化一个循环队列
*/
struct CircleQueue *InitQueue()
{
	struct CircleQueue * cq = malloc(sizeof(struct CircleQueue));
	cq->front = -1;
	cq->rear = -1;
	cq->node_num = 0;
	return cq;
}
/*
	判断队列是否为空
		返回值：
			1	为空
			0	不为空
*/
int IsEmpty(struct CircleQueue * cq)
{
	// 队列不存在 || 队列元素个数为0 
	if(cq == NULL || cq->node_num == 0)
	{
		return 1;
	}
	return 0;
}
/*
	获取队列的长度，即元素的个数
*/
int QueueLength(struct CircleQueue * cq)
{
	if(cq == NULL)
	{
		return 0;
	}
	return cq->node_num;
}
/*
	入队 
		返回值
			1	入队成功
			0	入队失败
*/
int EnQueue(struct CircleQueue * cq, ElemType d)
{
	//不能入队的情况： 队列不存在 || 队列满了
	if(cq == NULL || cq->node_num == MAX_LEN)
	{
		printf("Queue is full!\n");
		return 0;
	}

	//入队 ，只允许在 队尾进行入队操作
	if(cq->node_num == 0)
	{
		cq->front = (cq->front + 1) % MAX_LEN;
		cq->rear = (cq->rear + 1) % MAX_LEN;
		cq->data[ cq->rear ] = d;
	}
	else
	{
		cq->rear = (cq->rear + 1) % MAX_LEN;
		cq->data[ cq->rear ] = d;
	}
	cq->node_num ++;

	return 1;
}
/*
	出队
		返回值
			1	出队成功
			0	出队失败
*/
int DeQueue(struct CircleQueue * cq, ElemType *d)
{
	//不能出队的情况：队列不存在 || 队为空 
	if(cq == NULL || cq->node_num == 0)
	{
		printf("CircleQueue id empty\n");
		return 0;
	}

	//出队，在队首的位置进行出队
	*d = cq->data[ cq->front ];
	cq->node_num --;

	if(cq->node_num == 0)
	{
		cq->front = (cq->front + 1) % MAX_LEN;
		cq->rear = (cq->rear + 1) % MAX_LEN;
	}
	else
	{
		cq->front = (cq->front + 1) % MAX_LEN;
	}
	return 1;
}

/*
	获取队首元素，但是不出队
		返回值
		1	获取成功
		0	获取失败
*/
int GetHead(struct CircleQueue * cq, ElemType *d)
{
	//不能出队的情况：队不存在 || 队为空 
	if(cq == NULL || cq->node_num == 0)
	{
		printf("CircleQueue id empty\n");
		return 0;
	}

	*d = cq->data[ cq->front ];
	return 1;
}

/*
	清空队列
*/			
void ClearQueue(struct CircleQueue * cq)
{
	if(cq)
	{
		cq->front = -1;
		cq->rear = -1;
		cq->node_num = 0;
	}
}
/*
	销毁队列
*/
void DestroyQueue(struct CircleQueue * cq)
{
	if(cq)
	{
		cq->front = -1;
		cq->rear = -1;
		cq->node_num = 0;

		free(cq);
	}
}


int main()
{
	char ch1,ch2;
	CQ *cq=InitQueue();	//初始化队列
	for(;;)
	{
		for(;;)
		{
			printf("A");
			usleep(10000);
			if(kbhit())
			{
				ch1=getch();
				EnQueue(cq,ch1);
				if(!EnQueue(cq, ch1))
				{
					break;
				}
			}
			if(ch1==','||ch1==';')
			{
				break;
			}		
		}
		while(!IsEmpty(cq))
		{
			GetHead(cq, &ch2);	//取队首元素
			putchar(ch2);
			DeQueue(cq, &ch2);
		}
		if(ch1==';')
			break;
}
	return 0;
}
